import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

    //连连看
    //由题中式子 |a - c| = | b - d| > 0 分析得
    //只要是在同一条对角线上的元素的坐标都可以
    //所以可以统计每一个对角线上的元素，若有 i 组 2 个相同的元素

    //枚举每一条对角线
    //统计对角线上元素个数的值


    public static int[][] a = new int[1003][1003];
    public static int n;
    public static int m;
    public static long ans;

    //主对角线
    public static long get_p(int x,int y){
        //每次向右下45度进行
        long res = 0;
        // key 代表值，val 代表出现次数
        Map<Integer,Integer> map = new HashMap<>();
        while(x <= n && y <= m){
            res += map.getOrDefault(a[x][y],0);
            map.put(a[x][y],map.getOrDefault(a[x][y],0) + 1);
            x++;
            y++;
        }
        return res * 2;
    }


    //反对角线

    public static long get_rp(int x,int y){
        // x :行 ，y :列
        //每次向左下45度进行
        //getOrDefault:返回 key 对应的 value，key 不存在，返回默认值
        long res = 0;
        Map<Integer,Integer> map = new HashMap<>();
        while(x <= n && y <= m){
            res += map.getOrDefault(a[x][y],0);
            map.put(a[x][y],map.getOrDefault(a[x][y],0) + 1);
            x++;
            y--;
        }
        return res * 2;
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        m = scan.nextInt();
        //编辑矩阵
        for(int i = 1; i <= n; i++){
            for(int j = 1 ; j <= m; j++){
                a[i][j] = scan.nextInt();
            }
        }
        //枚举每一根对角线
        //主对角线
        ans = 0;
        for(int i = 1; i < m; i++){
            ans += get_p(1,i);
        }
        for(int i = 2; i < n; i++){
            ans += get_p(i,1);
        }

        //反对角线
        for(int i = 2; i <= m; i++){
            ans += get_rp(1,i);
        }
        for(int i = 2; i < n; i++){
            ans += get_rp(i,m);
        }
        System.out.println(ans);
        scan.close();
    }
}
